package com.example;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.core.JsonProcessingException;

import java.util.List;
import java.util.ArrayList;

/**
 * JSON 工具类，用于处理 JSON 数据的序列化和反序列化
 */
public class JsonUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    static {
        // 设置格式化输出
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    }

    /**
     * 将对象转换为 JSON 字符串
     * @param obj 要转换的对象
     * @return JSON 字符串
     */
    public static String toJson(Object obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            System.err.println("JSON 序列化失败: " + e.getMessage());
            return null;
        }
    }

    /**
     * 将 JSON 字符串转换为指定类型的对象
     * @param json JSON 字符串
     * @param clazz 目标类型
     * @param <T> 泛型类型
     * @return 转换后的对象
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return objectMapper.readValue(json, clazz);
        } catch (JsonProcessingException e) {
            System.err.println("JSON 反序列化失败: " + e.getMessage());
            return null;
        }
    }

    /**
     * 示例方法：演示 JSON 的使用
     */
    public static void demonstrateJsonUsage() {
        // 创建学生列表
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三", 20, "计算机科学"));
        students.add(new Student("李四", 21, "软件工程"));
        students.add(new Student("王五", 22, "信息安全"));

        // 转换为 JSON
        String json = toJson(students);
        System.out.println("学生列表的 JSON 表示:");
        System.out.println(json);

        // 从 JSON 转换回来（这里只是演示，实际需要处理数组类型）
        String singleStudentJson = toJson(new Student("赵六", 23, "数据科学"));
        Student student = fromJson(singleStudentJson, Student.class);
        System.out.println("\n从 JSON 恢复的学生对象:");
        System.out.println(student);
    }

    /**
     * 主方法，用于测试
     */
    public static void main(String[] args) {
        demonstrateJsonUsage();
    }
}